package com.zhanglijie.improve.aqs.exclusive.interupt;

import java.util.concurrent.locks.LockSupport;

/**
 * @author zhanglijie
 * @version 1.0
 * @since 1.1.0 2022/9/12 0012 1:17
 */
public class AqsParkTest {
    public static void main(String[] args) {
        Thread mainThread = Thread.currentThread();
        new Thread(()->{
            try {
                System.out.println("sub thread run");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //唤醒main线程
            System.out.println("park 修改中断标记吗 ？"+mainThread.isInterrupted());
             LockSupport.unpark(mainThread); //方式一唤醒
            /**
             *
             * 1、this.interrupt()
             *
             * 2.static.interupted()
             * interupted (Thread的static方法）  这个先返回中断标记然后清楚标记 后面都是false
             *
             * 3. this.isInterupted()  这个先返回中断标记并不清除中断标记,所以一旦中断过了不管此方,如果中断了只会第一次返回true,后面方法执行多少次都是返回true
             *
             */

          //  mainThread.interrupt();//方式二 唤醒  如果是interrupt唤醒 这个第二次park将会失效  这个可以通过Thread.interupted()清楚中断标记


        }).start();

        for (int i = 0; i < 10; i++) {
            System.out.println("即将阻塞main");
            LockSupport.park();//阻塞main线程  如果是interrupt唤醒 这个第二次park将会失效
            // Thread.interrupted();解决 interupt造成后面无法park问题
            System.out.println("main thread 继续运行");
        }

    }
}
